home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d13 / ptv2n1.arc / TYPES.CPP < prev    next >
Text File  |  1991-03-26  |  2KB  |  79 lines

  1. // TYPES.CPP provides the code to create and destroy typed-value
  2. // objects and to convert the internal value of an object into
  3. // an ordinary program variable of any of the supported types.
  4.  
  5.  #include <string.h>
  6.  #include <stdio.h>
  7.  #include <stdlib.h>
  8.  #include <values.h>
  9.  #include <types.h>
  10.  
  11.  
  12.  ///////Code for the value classes
  13.  //The code for each function is kept in parallel so we can
  14.  //take advantage of the symmetry across the types
  15.  
  16.  
  17.  //constructors
  18.  char* invalid="invalid";//Address indicates error
  19.  
  20.  value::value(){namptr=NULL;};
  21.  value::value(char* namestr){
  22.       namptr=namestr? strdup(namestr):NULL;
  23.       if(!namptr) namptr=invalid;}
  24.  ival::ival(char* namestr, int val):value(namestr){
  25.       data=val;}
  26.  lval::lval(char* namestr, long val):value(namestr){
  27.       data=val;}
  28.  sval::sval(char* namestr, char* val):value(namestr){
  29.       data=val? strdup(val):NULL;
  30.       if(!data) namptr=invalid;}
  31.  
  32.  
  33.  //destructors
  34.  value::~value(){if(namptr!=invalid) delete namptr;}
  35.  sval::~sval(){delete data;};
  36.  
  37.  
  38.  //characteristics
  39.  value::valid(){return namptr!=invalid;}//address, NOT string
  40.  
  41.  
  42.  datatype value::type(){return EMPTY;};
  43.  datatype ival::type(){return INT;};
  44.  datatype lval::type(){return LONG;};
  45.  datatype sval::type(){return STRING;};
  46.  
  47.  
  48.  char* value::typename(){return "EMPTY";}
  49.  char* ival::typename(){return "INT";}
  50.  char* lval::typename(){return "LONG";}
  51.  char* sval::typename(){return "STRING";}
  52.  
  53.  //function required for tests below
  54.  long absval(long N){return N>0? N:-N;}
  55.  
  56.  
  57.  //return value as specified variable type
  58.  //signed integer - returns zero if conversion not possible
  59.  int value::asint(){return 0;}
  60.  int ival::asint(){return data;}
  61.  int lval::asint(){return (absval(data)<=MAXINT)? data:0;}
  62.  int sval::asint(){return atoi(data);}
  63.  
  64.  
  65.  //signed long - returns zero if conversion not possible
  66.  long value::aslong(){return 0;};
  67.  long ival::aslong(){return data;}
  68.  long lval::aslong(){return data;}
  69.  long sval::aslong(){return atol(data);}
  70.  
  71.  
  72.  //string - re-uses same buffer at each call
  73.  static char valbuf[40];
  74.  const char* value::asstring(){return typename();}
  75.  const char* ival::asstring(){return itoa(data,valbuf,10);}
  76.  const char* lval::asstring(){return ltoa(data,valbuf,10);}
  77.  const char* sval::asstring(){return data;}
  78.  
  79.